//
// Copyright (c) 2011 Alex Nesterenko
//

#include "nane/core/crt/std/StdFileSystemImpl_.h"
#include "nane/core/crt/std/StdReadFile_.h"
#include "nane/core/crt/std/StdWriteFile_.h"

#include <cstdlib>
#include <cstdio>
#include <string>

namespace nane 
{
    ////////////////////////////////////////////////////////////////////////////////////////////////
    FileSystem::Implementation::Implementation()
    {
        
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    FileSystem::Implementation::~Implementation()
    {
        
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    bool FileSystem::Implementation::initialize()
    {
        return true;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    void FileSystem::Implementation::shutdown()
    {
        
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    IReadFile* FileSystem::Implementation::openReadFile( const char* _filename )
    {
        StdReadFile* readFile = NULL;
        FILE* hFile = std::fopen(_filename, "rb");
        if( hFile != NULL )
        {
            readFile = new StdReadFile(this, hFile, _filename);
        }
        return readFile;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    IWriteFile* FileSystem::Implementation::openWriteFile( const char* _filename )
    {
        StdWriteFile* writeFile = NULL;
        FILE* hFile = std::fopen(_filename, "wb");
        if( hFile != NULL )
        {
            writeFile = new StdWriteFile(this, hFile, _filename);
        }
        return writeFile;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    bool FileSystem::Implementation::exists( const char* _filename )
    {
        // no way to check, so assume it is exists
        return true;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    bool FileSystem::Implementation::deleteFile( const char* _filename )
    {
        return std::remove(_filename) == 0;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    bool FileSystem::Implementation::createFolder( const char* _path )
    {
        std::string command = "mkdir ";
        command.append(_path);
        return system( command.c_str() ) == 0;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    bool FileSystem::Implementation::deleteFolder( const char* _path )
    {
        std::string command = "rmdir ";
        command.append(_path);
        return system( command.c_str() ) == 0;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    void FileSystem::Implementation::release( StdReadFile* _stdReadFile )
    {
        std::fclose(_stdReadFile->m_interface);
        delete _stdReadFile;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    void FileSystem::Implementation::release( StdWriteFile* _stdWriteFile )
    {
        std::fclose(_stdWriteFile->m_interface);
        delete _stdWriteFile;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
}   // namespace nane
